package com.example.demo.aop;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

/**
 * Created with IntelliJ IDEA.
 * Description: 定义切面类
 */
@Aspect
@Component
public class UserAspect2 {
    @Pointcut("execution(* com.example.demo.controller.UserController.*(..))")
    public void pointcut() {}

    // 前置通知
    @Before("pointcut()")
    public void beforeAdvice() {
        System.out.println("执行 before 通知");
    }

    // 后置通知
    @After("pointcut()")
    public void afterAdvice() {
        System.out.println("执行 after 通知");
    }

//    // 返回之后通知
//    @AfterReturning("pointcut()")
//    public void afterReturnAdvice() {
//        System.out.println("执行 AfterReturning 通知");
//    }

    // 环绕通知
    @Around("pointcut()")
    // ProceedingJoinPoint 就是执行连接点对象，即我们需要知道我们拦截的具体是哪个方法
    public Object aroundAdvice(ProceedingJoinPoint joinPoint) throws Throwable {
        Object obj = null;
        System.out.println("Around 方法开始执行");
        // 执行被拦截的业务代码
        // 相当于我们执行了一半的环绕通知方法，调用执行业务代码
        // 等业务代码执行完毕，继续执行后面的环绕通知方法
        obj = joinPoint.proceed();
        System.out.println("Around 方法结束执行");
        return obj;
    }


}
